/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Persistencia;

import Clases.Factura;
import Clases.SFacturacion;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;

/**
 * Esta clase es la persistencia a la base de datos para la gestión de SERIES DE FACTURACION. En esta clase se podrá:
 *    - Añadir una serie
 *    - Obtener una serie
 *    - Obtener todos las series de facturacion
 * @author Jesús Fernández
 */
public class PersistenciaSFacturacion {


    public static int insertarSFacturacion(SFacturacion sfac){

        int ret = 0;
        
        // datos para hacer la inserción de la serie de facturacion recibida
        String serie = sfac.getSerie();
        String codigo = sfac.getCodigo();
        String descripcion = sfac.getDescripcion();
        boolean existe = false;
       
        // obtengo todas las series para comprobar si existe la que se quiere insertar
        List<SFacturacion> listaseries = obtenerSeries();
        for(SFacturacion s: listaseries){
            if(sfac.equals(s)){
                existe = true;
                ret = 3;
            }
        }
        
        // sentencia SQL para la insercion en BD
        String sql = "insert into sfacturacion (serie, codigo, descripcion)"
                   + " values ('"+ serie +"', '"+ codigo +"','"+ descripcion + "');";

        // declaracion de variables para la conexion de la BD
        Connection con  = null;
        Statement st = null;

        // CONEXION y ejecucion de la sentencia SQL
        try{
            con = Conexion.getConexion();
            if(!existe){
                st = con.createStatement();
                ret = st.executeUpdate(sql);
            }
        }
        catch(Exception e){
            System.out.println("Error al insertar una nueva SERIE DE FACTURACIÓN \n\n"+e.getMessage());
        }
        finally{
            Conexion.cerrarConexion(con);
        }

        return ret;
    }
    
     public static int actualizaSFacturacion(SFacturacion sfac, String serieBD){

        int ret = 0;
        
        // datos para hacer la inserción de la serie de facturacion recibida
        String serie = sfac.getSerie();
        String codigo = sfac.getCodigo();
        String descripcion = sfac.getDescripcion();
       
        // sentencia SQL para la insercion en BD
        String sql = "update sfacturacion set serie='"+ serie +"', codigo='"+ codigo
                        + "', descripcion='"+ descripcion +"' where serie='"+ serieBD +"';";

        // declaracion de variables para la conexion de la BD
        Connection con  = null;
        Statement st = null;

        // CONEXION y ejecucion de la sentencia SQL
        try{
            con = Conexion.getConexion();
            st = con.createStatement();
            ret = st.executeUpdate(sql);
        }
        catch(Exception e){
            System.out.println("Error al insertar una nueva SERIE DE FACTURACIÓN \n\n"+e.getMessage());
        }
        finally{
            Conexion.cerrarConexion(con);
        }

        return ret;
    }


    public static SFacturacion obtenerSFacturacion(String serie){

        // sentencia SQL
        String sql= "select * from sfacturacion where serie = '"+ serie +"';";

        // declaracion de variables para la conexion y ejecucion de la SQL en BD
        Connection con = null;
        Statement st = null;
        ResultSet rs = null;

        // declaracion de variables para el objeto SFacturacion
        SFacturacion sfac = null;
        String codigo = null;
        String descripcion = null;


        try{
            con = Conexion.getConexion();
            st = con.createStatement();
            rs = st.executeQuery(sql);
            if(rs.next()){
                
                codigo = rs.getString("codigo");
                descripcion = rs.getString("descripcion");
                
                sfac = new SFacturacion(serie, codigo, descripcion);

            }

            rs.close();
            st.close();

        }
        catch(Exception e){
            System.out.println("Error al obtener la SERIE DE FACTURACION \n "+e.getMessage());
        }
        finally{
            Conexion.cerrarConexion(con);
        }
        return sfac;
    }


/*
     public static void borrarCliente(String loginConsultado) throws SQLException{

        String sql = "delete from cliente where login = '"+loginConsultado+"'";
        
        Connection con  = null;
        Statement st = null;
        try{
            con = Conexion.getConexion();
            st = con.createStatement();
            st.execute(sql);
            st.close();
        }
        catch(Exception e){
            System.out.println("Error al borrar el cliente "+e.getMessage());

        }
        finally{
            Conexion.cerrarConexion(con);
        }
    }
*/


    public static ArrayList<SFacturacion> obtenerSeries(){

        // sentencia SQL
        String sql = "select * from sfacturacion";

        // declaracion de variables para el objeto SFacturacion
        ArrayList<SFacturacion> listaseries= new ArrayList();
        SFacturacion sfac = null;
        String serie = null;
        String codigo = null;
        String descripcion = null;

        // declaracion de variables para la conexion de la BD
        Connection con = null;
        Statement st = null;
        ResultSet rs = null;

        try{
            con = Conexion.getConexion();
            st = con.createStatement();
            rs = st.executeQuery(sql);

            while(rs.next()){

                serie = rs.getString("serie");
                codigo = rs.getString("codigo");
                descripcion = rs.getString("descripcion");
                
                sfac = new SFacturacion(serie, codigo, descripcion);
                
                listaseries.add(sfac);
            }
            
            rs.close();
            st.close();
        }
        catch(Exception e){
            System.out.println("Error al obtener todos las SERIES \n "+e.getMessage());
        }
        return listaseries;
    }
    
    public static int eliminarSerie(String serie) {

         int insertado = 0;
        
        Connection con = null;
        Statement st = null;
        //ResultSet rs = null;
        boolean existe = false;
        
        
        String sql = "delete from sfacturacion where serie = '" + serie + "';";
        
        List<Factura> listafactura = PersistenciaFactura.obtenerFacturas();
        for(Factura f: listafactura){
            if(f.getSerieFacturacion().getSerie().equals(serie)){
                existe = true;
                insertado = 2;
            }
        }

        try {
            con = (Connection) Conexion.getConexion();
            if(!existe){
                st = (Statement) con.createStatement();
                insertado = st.executeUpdate(sql);
            }

        } catch (Exception e) {
            System.out.println("Error al eliminar serie\n " + e.getMessage());
        } finally {
            Conexion.cerrarConexion(con);
        }
        return insertado;
    }
    
    public static int incrementarCodigo(SFacturacion sf) throws SQLException
    {
        Connection con = null;
        Statement st = null;
        ResultSet rs = null;
        Statement st2 = null;
        ResultSet rs2 = null;  
        int ret = 0;
        
        char[] cadena = null;        
        

        String sql = "select * from sfacturacion where serie = '" + sf.getSerie() + "';";
        try{
            con = Conexion.getConexion();
            st = con.createStatement();
            rs = st.executeQuery(sql);

            if(rs.next()){
                String cod = rs.getString("codigo");  
                cadena = cod.toCharArray();
                int j=cadena.length-1;
                boolean encontrado = false;
                
                while(!encontrado)
                {
                    if(cadena[j] == '9')
                    {
                        cadena[j]='0';
                        j--;                   
                    }
                    else
                    {
                        if(cadena[j]!='-')
                        {
                        cadena[j]++;
                        encontrado=true;
                        }
                        else
                            encontrado=true;
                    }                
                 }
                

            }
            String incrementado = new String(cadena);
            rs.close();
            st.close();
            
            
            
            String sql2 = "update sfacturacion set "
                + "codigo = '" + incrementado + "' "                    
                + " where serie = '" + sf.getSerie() + "'";                    
            
            st2 = con.createStatement();
            ret = st2.executeUpdate(sql2);
            
            
            
        } catch (Exception e) {
            System.out.println("Error al consultar serie\n " + e.getMessage());
        } finally {
            Conexion.cerrarConexion(con);
        }  
        return ret;
    }   
    
    public static String obtenerCodigo(SFacturacion sf)
    {
        String sql = "select codigo from sfacturacion where serie = '"+sf.getSerie()+"'";
        String codigo = null;

        Connection con = null;
        Statement st = null;
        ResultSet rs = null;

        try{
            con = Conexion.getConexion();
            st = con.createStatement();
            rs = st.executeQuery(sql);

            if(rs.next()){

                codigo = rs.getString("codigo");

            }
            
            rs.close();
            st.close();
        }
        catch(Exception e){
            System.out.println("Error al obtener todos las SERIES \n "+e.getMessage());
        }
        return codigo;        
        
    }
}
    
    

